Runtime partitioning and allocation of processing system resources among virtual machines enables vendors to offer tailored data processing solutions to end users. For example, in a computing system having more processor cores, operating memory and mass storage than needed for a given processing application, an end-user/system designer may specify a virtual machine allocation that includes a task-appropriate subset of the processor cores and corresponding fractions of the operating memory and mass storage. The remaining cores, memory and mass storage may then be allocated to one or more other virtual machines, with all such virtual machines theoretically capable of concurrent conflict-free operation.
Unfortunately, not all resource allocations align neatly with the delineations between virtual machines. In particular, while on-board cache memories are commonly dedicated to respective processor cores and thus split between virtual machines accordingly, the significantly larger last-level cache memory is typically shared among the processor cores as a matter of practicality, and consumed on a first-come, first served basis. Consequently, despite careful allocation of computing resources to respective virtual machines, a poorly or maliciously designed program executing within one virtual machine may consume a disproportionate share of the last-level cache, depleting cache availability within other virtual machines and thus degrading their performance despite otherwise sufficient resource allocations.